package com.yj.springbootstudy.config;


import com.yj.springbootstudy.config.profile.Hello;
import com.yj.springbootstudy.config.profile.MyImport;
import org.springframework.context.annotation.*;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;


/**
 * @ComponentScan:指定扫描策略，指定哪些需要被扫描，哪些不需要扫描
 *      Filter[]excludeFilters
 *      Filter[]includeFilters
 *
 * @Filter
 *      type:FilterType.ANNOTATION,FilterType.ASSIGNABLE_TYPE,FilterType.ASPECTJ,FilterType.REGEX,FilterType.CUSTOM
 *
 *
 */
@Configuration
@ComponentScan(value = "com.yj.springbootstudy.config",
        excludeFilters ={
//        @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = {Controller.class, Service.class}),
                @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,classes = {User.class}),
                @ComponentScan.Filter(type = FilterType.CUSTOM,classes = MyTypeFilter.class)
        })
//1、根据注解来排除(type=FilterType.ANNOTATION)，这些注解的类型为classes = {Controller.class,Service.class}。
//即Controller，Service注解标注的类不再被纳入到IOC容器中
//2、根据类来排除(type=FilterType.ASSIGNABLE_TYPE)，这些类的类型为classes = {User.class}
//即User.class 其子类，实现类都会被排除
//@Import(value = {Hello.class}) //@Import来快速地往IOC容器中添加组件,如果需要一次性导入多个组件可以使用ImportSelector
@Import(value = MyImport.class)
public class WebConfig {


    /**
     * singleton：单实例（默认）,在Spring IOC容器启动的时候会调用方法创建对象然后纳入到IOC容器中，以后每次获取都是直接从IOC容器中获取（map.get()）；
     *
     * prototype：多实例，IOC容器启动的时候并不会去创建对象，而是在每次获取的时候才会去调用方法创建对象；
     *
     * request：一个请求对应一个实例；
     *
     * session：同一个session对应一个实例。
     * @return
     */
    @Bean
//    @Scope(value = "prototype")
    @Lazy
    @Conditional(value = MyCondition.class)
    public User user(){
        System.out.println("往IOC容器中注册User Bean");
        return new User("yj",23);
    }

    @Bean
    public CherryFactory cherryFactory(){
        return new CherryFactory();
    }
}
